<?php
App::uses('Component', 'Controller');

class UtilitiesComponent extends Component {
    
    private function asorti($arr) {
        $arr2 = $arr;
        foreach($arr2 as $key => $val) {
            $arr2[$key] = strtolower($val);
        }

        asort($arr2);
        foreach($arr2 as $key => $val) {
            $arr2[$key] = $arr[$key];
        }

        return $arr2;
    }
    
    public function adicionarItemChaveVazia(&$vetor, $texto, $ordenar = true) {
        if($ordenar){
            $vetor = $this->asorti($vetor);
        }
        $retorno[''] = $texto;
        foreach ($vetor as $chave => $valor)
            $retorno[$chave] = $valor;
        $vetor = $retorno;
    }
    
    public function formatarCPF(&$cpf){
        if(substr_count($cpf, '.') > 0){
            $cpf = str_replace('.', '', $cpf);
            $cpf = str_replace('-', '', $cpf);
        }else{
            $cpf = substr($cpf, 0, 3) . '.' .
                   substr($cpf, 3, 3) . '.' .
                   substr($cpf, 6, 3) . '-' .
                   substr($cpf, 9, 2);
        }
    }
    
    public function formatarData(&$data, $sql = true){
        if($sql){
            $separador = '/';
            $novoSeparador = '-';
        }else{
            $separador = '-';
            $novoSeparador = '/';
        }
        
        $dataArray = explode($separador, $data);
        
        if($dataArray[0] != ''){
            $data = $dataArray[2] . $novoSeparador . $dataArray[1] . $novoSeparador . $dataArray[0];
        }else{
            $data = '';
        }
    }
    
    public function formatarDecimal(&$numero, $sql = true){
        if($sql){
            $arrayInteiroDecimal = explode(',', $numero);
            $numero = str_replace('.', '', $arrayInteiroDecimal[0]) . '.' . $arrayInteiroDecimal[1];
        }  else {
            $arrayNumero = explode('.', $numero);
            $qtdDigitos = strlen($arrayNumero[0]);

            $numeroFormatado = '';
            
            if ($qtdDigitos > 3) {
                for (;;) {
                    if ($qtdDigitos > 3) {
                        $numeroFormatado = '.' . substr($arrayNumero[0], $qtdDigitos - 3, 3);
                    } else if ($qtdDigitos > 0) {
                        $numeroFormatado = substr($arrayNumero[0], 0, $qtdDigitos) . $numeroFormatado;
                        break;
                    }
                    $qtdDigitos = $qtdDigitos - 3;
                }
            } else {
                $numeroFormatado = $arrayNumero[0];
            }

            $numero = $numeroFormatado . ',' . $arrayNumero[1];
        }
    }
    
    public function validarCPF($cpf) {
        // determina um valor inicial para o digito $d1 e $d2
        // pra manter o respeito ;)
        $d1 = 0;
        $d2 = 0;
        // remove tudo que não seja número
        $cpf = preg_replace("/[^0-9]/", "", $cpf);
        // lista de cpf inválidos que serão ignorados
        $ignore_list = array(
            '00000000000',
            '01234567890',
            '11111111111',
            '22222222222',
            '33333333333',
            '44444444444',
            '55555555555',
            '66666666666',
            '77777777777',
            '88888888888',
            '99999999999'
        );
        // se o tamanho da string for dirente de 11 ou estiver
        // na lista de cpf ignorados já retorna false
        if (strlen($cpf) != 11 || in_array($cpf, $ignore_list)) {
            return false;
        } else {
            // inicia o processo para achar o primeiro
            // número verificador usando os primeiros 9 dígitos
            for ($i = 0; $i < 9; $i++) {
                // inicialmente $d1 vale zero e é somando.
                // O loop passa por todos os 9 dígitos iniciais
                $d1 += $cpf[$i] * (10 - $i);
            }
            // acha o resto da divisão da soma acima por 11
            $r1 = $d1 % 11;
            // se $r1 maior que 1 retorna 11 menos $r1 se não
            // retona o valor zero para $d1
            $d1 = ($r1 > 1) ? (11 - $r1) : 0;
            // inicia o processo para achar o segundo
            // número verificador usando os primeiros 9 dígitos
            for ($i = 0; $i < 9; $i++) {
                // inicialmente $d2 vale zero e é somando.
                // O loop passa por todos os 9 dígitos iniciais
                $d2 += $cpf[$i] * (11 - $i);
            }
            // $r2 será o resto da soma do cpf mais $d1 vezes 2
            // dividido por 11
            $r2 = ($d2 + ($d1 * 2)) % 11;
            // se $r2 mair que 1 retorna 11 menos $r2 se não
            // retorna o valor zeroa para $d2
            $d2 = ($r2 > 1) ? (11 - $r2) : 0;
            // retona true se os dois últimos dígitos do cpf
            // forem igual a concatenação de $d1 e $d2 e se não
            // deve retornar false.
            return (substr($cpf, -2) == $d1 . $d2) ? true : false;
        }
    }
    
    public function validarCNPJ($cnpj) {
        //Etapa 1: Cria um array com apenas os digitos numéricos, isso permite receber o cnpj em diferentes formatos como "00.000.000/0000-00", "00000000000000", "00 000 000 0000 00" etc...
        $j = 0;
        for ($i = 0; $i < (strlen($cnpj)); $i++) {
            if (is_numeric($cnpj[$i])) {
                $num[$j] = $cnpj[$i];
                $j++;
            }
        }
        //Etapa 2: Conta os dígitos, um Cnpj válido possui 14 dígitos numéricos.
        if (count($num) != 14) {
            $isCnpjValid = false;
        }
        //Etapa 3: O número 00000000000 embora não seja um cnpj real resultaria um cnpj válido após o calculo dos dígitos verificares e por isso precisa ser filtradas nesta etapa.
        if ($num[0] == 0 && $num[1] == 0 && $num[2] == 0 && $num[3] == 0 && $num[4] == 0 && $num[5] == 0 && $num[6] == 0 && $num[7] == 0 && $num[8] == 0 && $num[9] == 0 && $num[10] == 0 && $num[11] == 0) {
            $isCnpjValid = false;
        }
        //Etapa 4: Calcula e compara o primeiro dígito verificador.
        else {
            $j = 5;
            for ($i = 0; $i < 4; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $j = 9;
            for ($i = 4; $i < 12; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $resto = $soma % 11;
            if ($resto < 2) {
                $dg = 0;
            } else {
                $dg = 11 - $resto;
            }
            if ($dg != $num[12]) {
                $isCnpjValid = false;
            }
        }
        //Etapa 5: Calcula e compara o segundo dígito verificador.
        if (!isset($isCnpjValid)) {
            $j = 6;
            for ($i = 0; $i < 5; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $j = 9;
            for ($i = 5; $i < 13; $i++) {
                $multiplica[$i] = $num[$i] * $j;
                $j--;
            }
            $soma = array_sum($multiplica);
            $resto = $soma % 11;
            if ($resto < 2) {
                $dg = 0;
            } else {
                $dg = 11 - $resto;
            }
            if ($dg != $num[13]) {
                $isCnpjValid = false;
            } else {
                $isCnpjValid = true;
            }
        }
        
        //Etapa 6: Retorna o Resultado em um valor booleano.
        return $isCnpjValid;
    }

}

?>
